using Eureka.objetos;
using System.Data;
using System.Collections.Generic;
using System;

namespace Eureka.modelos
{
    public class Pergunta
    {
        private int id;
        private string enunciado;
        private string[] alternativas;
        private int[] estatisticas;
        private int temaID;
        private int dificuldade;
        private int resposta;

        #region encapsulated fields (set/get methods)
        public string Enunciado
        {
            get { return enunciado; }
            set { enunciado = value; }
        }

        public string[] Alternativas
        {
            get { return alternativas; }
            set { alternativas = value; }
        }

        public int TemaID
        {
            get { return temaID; }
            set { temaID = value; }
        }

        public int Dificuldade
        {
            get { return dificuldade; }
            set { dificuldade = value; }
        }

        public int Id
        {
            get { return id; }
            set { id = value; }
        }

        public int Resposta
        {
            get { return resposta; }
            set { resposta = value; }
        }

        public int[] Estatisticas
        {
            get { return estatisticas; }
            set { estatisticas = value; }
        }
        #endregion

        #region constructors
        public Pergunta(int id) 
        {
            this.id = id;
        }

        public Pergunta(int temaID, int dificuldade) 
        {
            this.temaID = temaID;
            this.dificuldade = dificuldade;
        }

        public Pergunta(int id, int[] estatisticas)
        {
            this.id = id;
            this.estatisticas = estatisticas;
        }

        public Pergunta(string enunciado, string[] alternativas, int temaID, int dificuldade)
        {
            this.enunciado = enunciado;
            this.alternativas = alternativas;
            this.temaID = temaID;
            this.dificuldade = dificuldade;
        }
        #endregion

        public void criar()
        {
            PerguntaDAO.criar(this.enunciado, this.alternativas, this.temaID, this.dificuldade);
        }

        public void apagar()
        {
            PerguntaDAO.apagar(this.id);
        }

        public void atualizar()
        {
            PerguntaDAO.atualizar(this.id, this.enunciado, this.alternativas, this.temaID, this.dificuldade);
        }

        public void atualizarEstatistica(string alternativa)
        {
            PerguntaDAO.atualizarEstatistica(this.id, alternativa);
        }

        public float[] buscarEstatistica()
        {
            int i = 0;
            int totalEstat = 0;
            float[] porcs = new float[5];

            foreach (int part in estatisticas)
                totalEstat += part;

            foreach (int part in estatisticas)
            {
                porcs[i] = ((float)part / (float)totalEstat) * 100;
                i++;
            }

            return porcs;
        }

        #region static methods
        static public DataSet buscarDataSet(int temaID, int dificuldade)
        {
            return PerguntaDAO.buscar(temaID, dificuldade);
        }

        static public List<int> sortear(List<int> temasIds, int dificuldade, int quantidade)
        {
            DataSet dt = PerguntaDAO.buscarIds(temasIds, dificuldade);
            List<int> ids = new List<int>();

            foreach (DataRow row in dt.Tables[0].Rows)
                ids.Add((int)row["id"]);

            return randomList(ids, quantidade);
        }

        static public Pergunta buscarPorId(int perguntaID)
        {
            DataRow row = PerguntaDAO.buscarPorId(perguntaID).Tables[0].Rows[0];
            string[] alternativas = new string[5];
            int[] estatisticas = new int[5];

            alternativas[0] = row["alternativaCorreta"].ToString();
            alternativas[1] = row["alternativaErrada1"].ToString();
            alternativas[2] = row["alternativaErrada2"].ToString();
            alternativas[3] = row["alternativaErrada3"].ToString();
            alternativas[4] = row["alternativaErrada4"].ToString();

            estatisticas[0] = (int)row["vezesRespondidaAltCorreta"];
            estatisticas[1] = (int)row["vezesRespondidaAltErrada1"];
            estatisticas[2] = (int)row["vezesRespondidaAltErrada2"];
            estatisticas[3] = (int)row["vezesRespondidaAltErrada3"];
            estatisticas[4] = (int)row["vezesRespondidaAltErrada4"];

            Pergunta pgta = new Pergunta(row["enunciado"].ToString(), alternativas, (int)row["id_tema"], (int)row["dificuldade"]);
            pgta.Id = (int)row["id"];
            pgta.estatisticas = estatisticas;
           
            return pgta;
        }

        static public void zerarEstatisticas(int perguntaID)
        {
            PerguntaDAO.zerarEstatistica(perguntaID);
        }
        #endregion

        #region private methods
        static private List<int> randomList(List<int> list, int qtde)
        {
            int[] idArray = list.ToArray();
            Random random = new Random();
            List<int> idList = new List<int>();

            while(idList.Count < list.Count && idList.Count < qtde)
            {
                int rnd = random.Next(list.Count);
                if (!idList.Contains(list[rnd])) idList.Add(list[rnd]);
            }

            return idList;
        }
        #endregion
    }
}
